package api

import (
	"encoding/json"
	"fmt"
	"reflect"
	"strconv"
	"zinx_websokect_poker/zinx/ziface"
	"zinx_websokect_poker/zinx/znet"
	"zinx_websokect_poker/zinx_app/poker_game/core"
	json2 "zinx_websokect_poker/zinx_app/poker_game/json"
	"zinx_websokect_poker/zinx_app/poker_game/log"
)

//开始游戏入口
type GameApi struct {
	znet.BaseRouter
}

func (g *GameApi) Handle(request ziface.IRequest) {
	//根据连接获取玩家
	p, _ := request.GetConnection().GetProperty("Pid")
	pid := p.(uint32)
	o := core.OccupantMgrObj.GetOccupantByPid(pid)

	if r := o.GetRoom(); r == nil{
		fmt.Println("不在房间中，无法使用开始游戏操作")
	}else {
		fmt.Println("开始游戏")
		go r.StartDelay(&core.StartDelay{})
	}

}

//下注入口
type SetActionApi struct {
	znet.BaseRouter
}


func (s *SetActionApi) Handle(request ziface.IRequest) {

	p, _ := request.GetConnection().GetProperty("Pid")
	pid := p.(uint32)
	o := core.OccupantMgrObj.GetOccupantByPid(pid)

	jr :=  json2.Jsrep{}
	data := request.GetData()
	err := json.Unmarshal(data,&jr)
	//解析失败会报错，如json字符串格式不对，缺"号，缺}等。
	if err!=nil{
		fmt.Println(err)
	}
	m := jr.Msg.(map[string]interface{})

	//把字符串转回数字
	value := int32(0)
	switch reflect.ValueOf(m["value"]).Kind() {
	case reflect.String:
		if s,err := strconv.Atoi(m["value"].(string));err==nil{
			value = int32(s)
		}
	case reflect.Float64:
		value = int32(m["value"].(float64))
	default:
		value = 0
	}

	log.Info("Game-SetAction","玩家："+ o.Nickname + "，OutId :" +strconv.Itoa(int(o.OutId)) +
		"【下注命令】" + string(data))

	// todo 检测用户在线，是否游戏中。
	if o.IsGameing() == true {
		//游戏中，可以进行下注操作
		err := o.SetAction(value)
		if err != nil {
			log.Error("Game-SetAction","玩家："+ o.Nickname + "，OutId :" +strconv.Itoa(int(o.OutId))+
				"玩家下注错误,还未轮到你下注！！")
			fmt.Println("下注错误：",err)
		}
	}else {
		//todo 玩家不在游戏中
		log.Error("Game-SetAction","玩家："+ o.Nickname + "，OutId :" +strconv.Itoa(int(o.OutId))+
			"玩家不在游戏中,无法下注.")
		fmt.Println("玩家不在游戏中,无法下注.")
	}


}

//下注响应接口
type SetActionResponseApi struct {
	znet.BaseRouter
}

func (s *SetActionResponseApi) Handle(request ziface.IRequest){
	p, _ := request.GetConnection().GetProperty("Pid")
	pid := p.(uint32)
	o := core.OccupantMgrObj.GetOccupantByPid(pid)

	log.Info("Game-SetAction","玩家："+ o.Nickname + "，OutId :" +strconv.Itoa(int(o.OutId)) +
		"【下注响应】")

	// todo 检测用户在线，是否游戏中。
	if o.IsGameing() == true {
		//游戏中，可以进行下注操作
		err := o.SetActionResponse()
		if err != nil {
			log.Error("Game-SetAction","玩家："+ o.Nickname + "，OutId :" +strconv.Itoa(int(o.OutId))+
				"玩家响应错误,还未轮到你下注！！")
			fmt.Println("下注响应错误：",err)
		}
	}else {
		//todo 玩家不在游戏中
		log.Error("Game-SetAction","玩家："+ o.Nickname + "，OutId :" +strconv.Itoa(int(o.OutId))+
			"玩家不在游戏中,无法响应下注.")
		fmt.Println("玩家不在游戏中,无法响应下注.")
	}

}

//请求游戏阶段的相应
//	  Round2 = 53,  下注阶段二
//    Round3 = 54,  下注阶段三
//    Round4 = 55,  下注阶段四
//    Result = 56,  最终结算
//type ReqRound2Api struct {
//	znet.BaseRouter
//}
//
//func (r2 *ReqRound2Api) Handle(request ziface.IRequest){
//	o := getOcc(request)
//	//收到请求下一阶段的命令。填充chan
//	if o != nil && o.IsGameing(){
//		if r := o.GetRoom(); r != nil{
//			r.ReqRound(core.Round2)
//		}
//	}
//}
//
//type ReqRound3Api struct {
//	znet.BaseRouter
//}
//func (r *ReqRound3Api) Handle(request ziface.IRequest){
//	o := getOcc(request)
//	//收到请求下一阶段的命令。填充chan
//	if o != nil && o.IsGameing(){
//		if r := o.GetRoom(); r != nil{
//			r.ReqRound(core.Round3)
//		}
//	}
//}
//
//type ReqRound4Api struct {
//	znet.BaseRouter
//}
//func (r2 *ReqRound4Api) Handle(request ziface.IRequest){
//	o := getOcc(request)
//	//收到请求下一阶段的命令。填充chan
//	if o != nil && o.IsGameing(){
//		if r := o.GetRoom(); r != nil{
//			r.ReqRound(core.Round4)
//		}
//	}
//}
//
//type ReqResultApi struct {
//	znet.BaseRouter
//}
//func (r2 *ReqResultApi) Handle(request ziface.IRequest){
//	o := getOcc(request)
//	//收到请求下一阶段的命令。填充chan
//	if o != nil && o.IsGameing(){
//		if r := o.GetRoom(); r != nil{
//			r.ReqRound(core.Result)
//		}
//	}
//}